package com.xbts.system.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.xbts.common.exception.ServiceException;
import com.xbts.common.utils.StringUtils;
import com.xbts.system.domain.SeiMaterial;
import com.xbts.system.domain.SeiMaterialTemplate;
import com.xbts.system.domain.dto.InsertMaterialToTemplateDto;
import com.xbts.system.service.ISeiMaterialService;
import com.xbts.system.service.ISeiMaterialTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.xbts.system.mapper.SeiTaskMapper;
import com.xbts.system.domain.SeiTask;
import com.xbts.system.service.ISeiTaskService;
import com.xbts.common.utils.DateUtils;
import com.xbts.common.utils.SecurityUtils;
import org.springframework.transaction.annotation.Transactional;

/**
 * 下达任务Service业务层处理
 *
 * @author xbts
 * @date 2023-08-22
 */
@Service
public class SeiTaskServiceImpl extends ServiceImpl<SeiTaskMapper, SeiTask> implements ISeiTaskService {

    @Autowired
    private SeiTaskMapper seiTaskMapper;

    @Autowired
    private ISeiMaterialService materialService;

    @Autowired
    private ISeiMaterialTemplateService materialTemplateService;

    /**
     * 查询标书任务列表
     *
     * @return 标书列表
     */
    @Override
    public List<SeiTask> selectTaskList(SeiTask seiTask) {

        return seiTaskMapper.selectTaskList(seiTask.queryWrapper());
    }

    /**
     * 下达标书任务
     *
     * @param seiTask 任务内容
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean insertTask(SeiTask seiTask) {
        seiTask.setCreateBy(SecurityUtils.getUserId().toString());
        seiTask.setCreateTime(new Date());
        return save(seiTask);
    }

    /**
     * 删除标书任务
     *
     * @param tenderId 标书id
     * @return 结果
     */
    @Override
    public boolean deleteTender(String tenderId) {
        SeiTask seiTask = this.getById(tenderId);
        if(!seiTask.getCreateBy().equals(SecurityUtils.getUserId().toString())){
            throw new ServiceException("只能删除自己创建的标书！");
        }
        return removeById(tenderId);
    }

    /**
     * 修改标书任务
     *
     * @param seiTask 标书任务
     * @return 结果
     */
    @Override
    public boolean updateTender(SeiTask seiTask) {
        seiTask.setUpdateTime(DateUtils.getNowDate());
        seiTask.setUpdateBy(SecurityUtils.getUserId().toString());

        if(seiTask.getWhetherComplete()){
            SeiTask task = this.getById(seiTask);
            if(!task.getWhetherComplete()){
                Date createTime = task.getCreateTime();
                Date now = new Date();
                long time = createTime.getTime();
                long nowTime = now.getTime();
                seiTask.setTotalDuration((nowTime - time) / (1000 * 60));
                seiTask.setExecutionStatus(true);
                seiTask.setCompleteTime(now);
            }
        }
        return updateById(seiTask);
    }

    /**
     * 批量删除标书任务
     *
     * @param ids 多个主键id
     * @return 结果
     */
    @Override
    public boolean batchDeleteTenderById(List<String> ids) {
        return removeBatchByIds(ids);
    }

    /**
     * 查询我的任务
     *
     * @param headOfTender 标书负责人
     * @return 标书表单
     */
    public List<SeiTask> selectMyTaskList(String headOfTender) {
        SeiTask seiTask = new SeiTask();
        seiTask.setHeadOfTender(headOfTender);
        return seiTaskMapper.selectTaskList(seiTask.queryWrapper());
    }

    /**
     * 查询我的任务
     *
     * @param content，executionStatus 搜索内容，执行状态
     * @return 标书表单
     */
    @Override
    public List<SeiTask> searchTasks(String content, Boolean executionStatus) {
        QueryWrapper<SeiTask> queryWrapper = new QueryWrapper<>();
        return list(queryWrapper.eq("execution_status", executionStatus).like("*", content));
    }

    @Override
    public SeiTask selectSeiTaskById(String tenderId) {
        SeiTask seiTask = seiTaskMapper.selectTaskInfo(tenderId);
        if(seiTask.getReadStatus() == 1 && SecurityUtils.getUserId().toString().equals(seiTask.getHeadOfTender())){
            seiTask.setReadStatus(2);
            this.updateById(seiTask);
        }
        return seiTask;
    }

    @Override
    public Map<String, Object> selectMaterialByTenderId(String tenderId) {
        HashMap<String, Object> map = new HashMap<>();
        // 查询所有素材
        List<SeiMaterial> list = materialService.list();

        if(list.size() < 1){
            return map;
        }
        Map<String, SeiMaterial> seiMaterialMap = list.stream().collect(Collectors.toMap(SeiMaterial::getMaterialId, v -> v));

        List<SeiMaterialTemplate> seiMaterialTemplates = materialTemplateService.list(new LambdaQueryWrapper<SeiMaterialTemplate>()
                .eq(SeiMaterialTemplate::getTemplateId, tenderId)
                .eq(SeiMaterialTemplate::getType, 2));
        if(seiMaterialTemplates.size() > 0){
            for (SeiMaterialTemplate seiMaterialTemplate : seiMaterialTemplates) {
                SeiMaterial material = seiMaterialMap.get(seiMaterialTemplate.getSecondLevelMaterialId());
                if(StringUtils.isNull(material)){
                    continue;
                }
                SeiMaterial threeLevelMaterial = seiMaterialMap.get(seiMaterialTemplate.getThreeLevelMaterialId());
                if(StringUtils.isNotNull(threeLevelMaterial)) {
                    material.setSelectedMaterialId(seiMaterialTemplate.getThreeLevelMaterialId());
                    material.setSelectedMaterialName(threeLevelMaterial.getName());
                } else {
                    material.setSelectedMaterialName("未知");
                }
            }
        }
        List<SeiMaterial> materialTree = new ArrayList<>();
        for (SeiMaterial seiMaterial : list) {

            if(seiMaterial.getType() == 3) continue;

            String parentId = seiMaterial.getParentId();
            if(StringUtils.isBlank(parentId) || "0".equals(parentId)) {
                materialTree.add(seiMaterial);
                continue;
            }

            SeiMaterial material = seiMaterialMap.get(seiMaterial.getParentId());
            if(StringUtils.isNotNull(material)){
                material.getChildren().add(seiMaterial);
            }
        }
        map.put("materialTree", materialTree);

        List<SeiMaterialTemplate> materialTemplates = materialTemplateService.list(new LambdaQueryWrapper<SeiMaterialTemplate>()
                .eq(SeiMaterialTemplate::getTemplateId, tenderId));

        for (SeiMaterialTemplate materialTemplate : materialTemplates) {
            String threeLevelMaterialId = materialTemplate.getThreeLevelMaterialId();
            SeiMaterial material = materialService.getById(threeLevelMaterialId);
            if(StringUtils.isNotNull(material)){
                materialTemplate.setThreeLevelMaterialName(material.getName());
            }
        }
        InsertMaterialToTemplateDto insertMaterialToTemplateDto = new InsertMaterialToTemplateDto();
        insertMaterialToTemplateDto.setTemplateId(tenderId);
        insertMaterialToTemplateDto.setList(materialTemplates);

        map.put("materialToTemplateDto", insertMaterialToTemplateDto);
        return map;
    }
}
